using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;


namespace GameFirst
{
    public class Animationsprite
    {
        public Texture2D spritesheet = null;//ho tolto il static

        private float frameInterval = 25f;
        private Point spriteSize = Point.Zero;
        public Vector2 spriteCenter = Vector2.Zero;//ho tolto il static

        public Rectangle sourceRect;//ho tolto il static

        private int numFrames = 0;
        private float timer = 0f;
        private int currentFramePosX = 0;
        private int currentFramePosY = 0;
        private int currentFrame = 0;

        public bool isAnimationEnded = false;//ho tolto il static
        private bool isLooping = true;
        
        Game G;
        public Animationsprite(Game game)
        {
            G = game;
            spriteSize = new Point(130,130); // la dimensione di un singolo sprite

            // memorizziamo il punto centrale di un singolo sprite
            spriteCenter.X = (float)spriteSize.X * 0.5f;
            spriteCenter.Y = (float)spriteSize.Y * 0.5f;

            spritesheet = G.Content.Load<Texture2D>("spritesheet7");
            // e calcoliamo il numero totale dei frames
            numFrames = (spritesheet.Width / spriteSize.X) *
                (spritesheet.Height / spriteSize.Y);

        }
        public bool getEndAnimation()
        {
            return isAnimationEnded;
        }
        public bool renderfinish = false;
        public void UpdateAni(GameTime gameTime)
        {
            // Controlliamo che il numero di frames sia sufficiente 
            // e che l'animazione non sia terminata
            if (numFrames < 2 || (isAnimationEnded && !isLooping))
                return;

            float deltaTime = (float)gameTime.ElapsedGameTime.TotalMilliseconds;

            // aggiorniamo il contatore dei millisecondi
            timer += deltaTime;

            // e se abbiamo superato la soglia di aggiornamento, ciè dopo un tot di tempo cambio immagine con l'immagine sucessiva
            if (timer > frameInterval)
            {
                // passiamo al frame successivo               
                currentFrame++;

                // siamo giunti al termine?
                if (currentFrame > numFrames)
                {
                    isAnimationEnded = true;
                    //aggiunte
                    isLooping = false;
                    currentFramePosX = 0; 
                    currentFramePosY = 0;
                    currentFrame = 0;
                }
                // se l'animazione è in loop ed è terminata resettiamo tutto
                if (isLooping && isAnimationEnded)
                {
                    currentFramePosX = 0;
                    currentFramePosY = 0;
                    currentFrame = 0;
                    isAnimationEnded = false;
                    renderfinish = true;
                }
                else if (!isAnimationEnded) //se non abbiamo finito i frame dell'esplosione passiamo al frame dopo
                {
                    // altrimenti aggiorniamo la posizione del "cursore" sulla spritesheet
                    currentFramePosX++;
                    int x = currentFramePosX * spriteSize.X;
                    // controlliamo che non esca fuori dai bordi della spritesheet
                    if (x >= spritesheet.Width)
                    {
                        x = 0;
                        currentFramePosX = 0;
                        currentFramePosY++;
                    }
                    int y = currentFramePosY * spriteSize.Y;
                    sourceRect = new Rectangle(x, y, spriteSize.X, spriteSize.Y);
                }

                // infine azzeriamo il timer e siamo pronti per un nuovo frame
                timer = 0f;

            }
        }

    }
}
